package com.springmvc.platform.manage.service.impl;

import com.springmvc.platform.base.imapper.IMapper;
import com.springmvc.platform.base.service.impl.BaseServiceImpl;
import com.springmvc.platform.manage.domain.SysResource;
import com.springmvc.platform.manage.mapper.SysResourceMapper;
import com.springmvc.platform.manage.service.SysResourceService;
import com.springmvc.platform.result.ExecuteResult;
import com.springmvc.platform.util.BeanUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.common.Mapper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhouhong
 * @create 2017/10/8
 * @modify
 */
@Service
public class SysResourceServiceImpl extends BaseServiceImpl<SysResource> implements SysResourceService {
    @Autowired
    private SysResourceMapper sysResourceMapper;
    public IMapper<SysResource> getBaseMapper() {
        return sysResourceMapper;
    }
    public Map<Integer,List<SysResource>> queryAllResource() {
        //查询所有符合条件的资源
        List<SysResource> sysResourceList=sysResourceMapper.selectAllResource();
        //结构化资源数据
        Map<Integer,List<SysResource>> conMap=new HashMap<Integer, List<SysResource>>();
        initConstruction(conMap,sysResourceList,0L,0);
        return conMap;
    }

    public List<SysResource> queryAllTreeTableResource() {
        //查询所有符合条件的资源
        List<SysResource> sysResourceList=sysResourceMapper.selectAllResource();
        //结构化资源数据
        List<SysResource> sortList=new ArrayList<SysResource>(sysResourceList.size());
        sortListAsc(sortList,sysResourceList,0L);
        return sortList;
    }

    public ExecuteResult<List<SysResource>> queryResourceByResource(SysResource sysResource) {
        ExecuteResult<List<SysResource>> result=new ExecuteResult<List<SysResource>>();
        result.setResult(sysResourceMapper.selectAllResource());
        result.setSuccessMessage("查询成功");
        return result;
    }

    /**
     * 初始化首页菜单层级结构
     * @param conMap
     * @param toConList
     * @param pid
     * @param layer
     */
    private void initConstruction(Map<Integer,List<SysResource>> conMap,List<SysResource> toConList,Long pid,int layer){
        //迭代层级+1
        layer++;
        //循环要结构化的数据
        for(SysResource sysResource:toConList){
            //如果属于此资源下的子资源,加入该层级的map中
            if(pid==sysResource.getResourcePid()){
                addToMap(conMap,sysResource,layer);
            }
        }
        //如果conMap 当前层级不为空则进行递归组装下一层级
        List<SysResource> currLayerList=conMap.get(layer);
        if(!BeanUtil.isEmpty(currLayerList)){
            for (SysResource sysResource:currLayerList){
                //判断是否为叶子节点
                if(sysResource.getIsLeafNode()!=1){
                    //不为叶子节点,进行迭代,取出id作为pid进行迭代
                    initConstruction(conMap,toConList,sysResource.getId(),layer);
                }
            }
        }
    }

    /**
     * 层级map
     * @param conMap
     * @param sysResource
     * @param layer
     */
    private void addToMap(Map<Integer,List<SysResource>> conMap,SysResource sysResource,int layer){
        //获取当前层的数据
        List<SysResource> containList= conMap.get(layer);
        //如果为空，新增
        if(BeanUtil.isEmpty(containList)){
            List<SysResource> initList=new ArrayList<SysResource>();
            //添加元素
            initList.add(sysResource);
            conMap.put(layer,initList);
        }else{
            List<SysResource> exsistList=conMap.get(layer);
            exsistList.add(sysResource);
            conMap.put(layer,exsistList);
        }
    }

    /**
     * 初始化资源列表层级结构
     * @param sortList
     * @param sysResourceList
     * @param pId
     */
    private void sortListAsc(List<SysResource> sortList, List<SysResource> sysResourceList, Long pId) {
        //循环排序前的list
        for (SysResource sysResource:sysResourceList){
            //判断是否为当前pId下的子节点
            if(pId==sysResource.getResourcePid()){
                //进行排序
                //由于已经在数据库中进行了排序所以不需要在代码中再进行排序，直接添加元素即可
                sortList.add(sysResource);
                //添加后判断该元素是否含有子节点，如果有，则添加子节点,进行迭代
                sortListAsc(sortList,sysResourceList,sysResource.getId());
            }
        }
    }

}
